/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package State;

/**
 * @version 1.0 Simple distributeur sans découpage des états
 * @author David
 */
public class Distributeur {
    
    final static int ETAT_ATTENTE_CARTE = 0;
    final static int ETAT_ATTENTE_CODE = 1;
    final static int ETAT_ATTENTE_OPERATION = 2;
    final static int ETAT_VIDE = 3;
    private int etat;
    public Carte c;
    // compteur pour le nombre d'erreur de code saisi
    public int err = 0;
    // somme disponible dans le distributeur
    public int SommeDispo = 1000;
    
    public Distributeur(){
        etat = ETAT_ATTENTE_CARTE;
    }
    
    /**
     * 
     * Pour chaque méthode on définit ce que l'utilisateur peut faire
     * ou ne pas faire selon l'état du distributeur
     */
    public void insererCarte(Carte client){
        if(etat == ETAT_ATTENTE_CARTE){
            c=client;
            System.out.println("Insertion carte client");
            etat= ETAT_ATTENTE_CODE;
        }
        else if(etat == ETAT_ATTENTE_CODE || etat == ETAT_ATTENTE_OPERATION){
            System.out.println("Carte déja présente dans le lecteur");
        }
        
    }
    
    public void entrerCode(int code){
        if(null!=c){
            if(c.isDispo()){
                if(etat == ETAT_ATTENTE_CARTE){
                    System.out.println("Inserer une carte");
                }
                else if(etat == ETAT_ATTENTE_CODE){
                    if(err<3&&c.entrerCode(code)){
                        err=0;
                        System.out.println("Code OK");
                        etat = ETAT_ATTENTE_OPERATION;
                        return;
                    }
                    else if(!c.entrerCode(code)){
                        System.out.println("Code Faux");
                        err++;
                        etat = ETAT_ATTENTE_CODE;
                        if(err == 3){
                            c.setDispo(false);
                            System.out.println("Carte avalé");
                            etat = ETAT_ATTENTE_CARTE;
                            err=0;
                        }
                        return;
                    }
                }
                else if(etat == ETAT_ATTENTE_OPERATION){
                    System.out.println("Veillez demander une opération");
                }
            }else{
                etat=ETAT_ATTENTE_CARTE;
                System.out.println("Carte avalée");
            }
        }else{
            System.out.println("Inserer une carte");
            etat=ETAT_ATTENTE_CARTE;
        }
//        etat = ETAT_ATTENTE_OPERATION;
    }
    
    public void retirerEspece(int somme){
        if(etat == ETAT_ATTENTE_CARTE){
            System.out.println("Inserer une carte");
        }
        else if(etat == ETAT_ATTENTE_CODE){
            System.out.println("Entez un code");
        }
        else if(etat == ETAT_ATTENTE_OPERATION){
            if(SommeDispo>= somme){
                SommeDispo -= somme;
                System.out.println("Retrait de "+somme+ "€ OK");
                etat= ETAT_ATTENTE_OPERATION;
                if(SommeDispo == 0) {
                    retirerCarte();
                    System.out.println("Carte rendu car distributeur vide");
                    etat = ETAT_VIDE;
                }
            }else{
                System.out.println("Somme non disponible, il reste "+SommeDispo);
            }
        }else if (etat ==ETAT_VIDE)
            System.out.println("Somme non disponible, il reste "+SommeDispo);
        
    }
    
    public void retirerCarte(){
        if(null!=c){
            if(etat == ETAT_ATTENTE_CARTE){
                System.out.println("Inserer une carte");
            }
            else if(etat == ETAT_ATTENTE_CODE || etat == ETAT_ATTENTE_OPERATION){
                if(c.isDispo()){
                    System.out.println("Carte retirée");
                    c= null;
                    etat = ETAT_ATTENTE_CARTE;
                }
            }
        }else{
            System.out.println("Inserez une carte");
        }
    }
    
    public void remplirDistrib(int somme){
        if(etat==ETAT_ATTENTE_CARTE || etat ==ETAT_VIDE){
            this.SommeDispo += somme;
            System.out.println("Nouveau solde :"+ SommeDispo+"€");
            etat = ETAT_ATTENTE_CARTE;
        }
    }
}
